﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net.Mail;
using System.Reflection;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Globalization;
using System.Management;
using System.Net.NetworkInformation;

namespace Core
{
    /// <summary>
    /// Xuannt 4/12/2013
    /// </summary>
    public class Utils
    {
        string syscf_File = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(new Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath), "syscf.txt");

        static Log _logFile = new Log();
        public static string[] arrUnicodeVN = new string[] { "á", "à", "ả", "ã", "ạ", "â", "ấ", "ầ", "ẩ", "ẫ", "ậ", "ă", "ắ", "ằ", "ẳ", "ẵ", "ặ",  
                "đ",  
                "é","è","ẻ","ẽ","ẹ","ê","ế","ề","ể","ễ","ệ",  
                "í","ì","ỉ","ĩ","ị",  
                "ó","ò","ỏ","õ","ọ","ô","ố","ồ","ổ","ỗ","ộ","ơ","ớ","ờ","ở","ỡ","ợ",  
                "ú","ù","ủ","ũ","ụ","ư","ứ","ừ","ử","ữ","ự",  
                "ý","ỳ","ỷ","ỹ","ỵ",};
        public static string[] ssDausodienthoai = new string[]
            {
                "090", "093", "0120", "0121", "0122", "0126", "0128",   //Mobifone
                "096", "097", "098", "0163", "0164", "0165", "0166", "0167", "0168", "0169",    //Viettel
                "091", "094", "0123", "0124", "0125", "0127", "0129",   //Vinaphone
                "092", "0188",  //Vietnammobile
                "095",  //Sfone
                "0993", "0994", "0995", "0996", "0199",     //Gmobile
                "099"   //Beeline: 0199
            };
        public static readonly SHA1CryptoServiceProvider PWD_CRYPTO = new SHA1CryptoServiceProvider();
        public static string sConnectString = ConfigurationSettings.AppSettings["ConnectString"];
        public static string sPathConfig = @""; //Path file text lưu thông tin đăng nhập
        public static string sKeyEncripts = "465897234562394857623498"; //Key mã hóa - chuỗi 24 kỹ tự

        //Key thao tác trên phần mềm
        public static int ACTION_READ = 1;
        public static int ACTION_WRITE = 2;
        public static int ACTION_EDIT = 3;
        public static int ACTION_DELETE = 4;
        public static int ACTION_PRINT = 5;
        public static int ACTION_IMPORT = 6;
        public static int ACTION_EXPORT = 7;
        public static string ACTION_SAVE_LOGIN = "1";

        //Table name
       
        //Fix Doanh Nghiep, DonVi mac dinh

        //Fix Bien chung

        //Menu 
        public static string strMENU_ = "";

        //Ma hoa cac chuoi tai khoan khi dang nhap
        private string UserID = "sys_ui";
        private string UserName = "sys_un";
        private string PassWord = "sys_pw";
        private string RoleID = "sys_ri";
        private string RoleName = "sys_rn";
        private string MacPC = "sys_mc";
        private string SaveLogin = "sys_slog";


        /// <summary>
        /// Hiển thị thông báo thành công (không confirm)
        /// </summary>
        /// <param name="text"></param>
        public static void message_Success(string text)
        {
        }

        /// <summary>
        /// Hiển thị cảnh báo (Confirm OK)
        /// </summary>
        /// <param name="text"></param>
        public static void message_Confirm(string text)
        {
        }

        /// <summary>
        /// Sinh chuoi ngau nhien
        /// </summary>
        /// <param name="length"></param>
        /// <returns></returns>
        public static string RandomString(int length)
        {
            try
            {
                Random r = new Random(Environment.TickCount);
                string chars = "0123456789abcdefghijklmnopqrstuvwxyz";
                StringBuilder builder = new StringBuilder(length);

                for (int i = 0; i < length; ++i)
                {
                    builder.Append(chars[r.Next(chars.Length)]);
                }
                return builder.ToString();
            }
            catch (Exception ex)
            {
                _logFile.Write("Exception when using Utils:RandomString : " + ex.Message + " Source:" + ex.Source + " StackTrace:" + ex.StackTrace);
                return "";
            }
        }

        /// <summary>
        /// Hàm chuyển đổi kiểu bảng không xác định trong LinQ sang kiểu DataTable
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="varlist"></param>
        /// <returns></returns>
        public DataTable LINQToDataTable<T>(IEnumerable<T> varlist)
        {
            DataTable dtReturn = new DataTable();

            // column names 
            PropertyInfo[] oProps = null;

            if (varlist == null) return dtReturn;

            foreach (T rec in varlist)
            {
                // Use reflection to get property names, to create table, Only first time, others will follow 

                if (oProps == null)
                {
                    oProps = ((Type)rec.GetType()).GetProperties();
                    foreach (PropertyInfo pi in oProps)
                    {
                        Type colType = pi.PropertyType;

                        if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition()
                        == typeof(Nullable<>)))
                        {
                            colType = colType.GetGenericArguments()[0];
                        }

                        dtReturn.Columns.Add(new DataColumn(pi.Name, colType));
                    }
                }

                DataRow dr = dtReturn.NewRow();

                foreach (PropertyInfo pi in oProps)
                {
                    dr[pi.Name] = pi.GetValue(rec, null) == null ? DBNull.Value : pi.GetValue
                    (rec, null);
                }

                dtReturn.Rows.Add(dr);
            }
            return dtReturn;
        }

        /// <summary>
        /// Sinh mat khau ngau nhien (chuoi ki tu co do dai la 6)
        /// </summary>
        /// <returns></returns>
        public static string RandomPassword()
        {
            return RandomString(6);
        }

        #region Các hàm chuyển đổi, convert, Mã hóa

        /// <summary>
        /// Xóa khoảng trắng thừa
        /// </summary>
        /// <param name="_string"></param>
        /// <returns></returns>
        public string ChuanHoaXau(string _string)
        {
            StringBuilder kq = new StringBuilder();
            _string = _string.Trim();
            for (int i = 0; i < _string.Length; i++)
            {
                kq.Append(_string[i]);
                if (_string[i] == ' ')
                {
                    while (_string[i] == ' ')
                    {
                        i++;
                    }
                    kq.Append(_string[i]);
                }
            }
            return kq.ToString();
        }

        /// <summary>
        /// Mã hóa
        /// </summary>
        /// <param name="toEncrypt"></param>
        /// <param name="key">key mã hóa(24 kí tự)</param>
        /// <param name="useHashing">Sử dụng MD5</param>
        /// <returns></returns>
        public string EncryptCode(string toEncrypt, string key, bool useHashing)
        {
            byte[] keyArray;
            byte[] toEncryptArray = Encoding.UTF8.GetBytes(toEncrypt);
            if (useHashing)
            {
                MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
                keyArray = hashmd5.ComputeHash(Encoding.UTF8.GetBytes(key));
            }
            else
            {
                keyArray = Encoding.UTF8.GetBytes(key);
            }
            TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
            tdes.Key = keyArray;
            tdes.Mode = CipherMode.ECB;
            tdes.Padding = PaddingMode.PKCS7;
            ICryptoTransform cTransform = tdes.CreateEncryptor();
            byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
            return Convert.ToBase64String(resultArray, 0, resultArray.Length);
        }

        /// <summary>
        /// Giải mã
        /// </summary>
        /// <param name="toDecrypt"></param>
        /// <param name="key"></param>
        /// <param name="useHashing"></param>
        /// <returns></returns>
        public  string DecryptCode(string toDecrypt, string key, bool useHashing)
        {
            byte[] keyArray;
            byte[] toEncryptArray = Convert.FromBase64String(toDecrypt);
            if (useHashing)
            {
                MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
                keyArray = hashmd5.ComputeHash(Encoding.UTF8.GetBytes(key));
            }
            else
            {
                keyArray = Encoding.UTF8.GetBytes(key);
            }
            TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
            tdes.Key = keyArray;
            tdes.Mode = CipherMode.ECB;
            tdes.Padding = PaddingMode.PKCS7;
            ICryptoTransform cTransform = tdes.CreateDecryptor();
            byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
            return Encoding.UTF8.GetString(resultArray);
        }

        public static string RemoveUnicode(string text)
        {
            string[] arr1 = new string[] { "á", "à", "ả", "ã", "ạ", "â", "ấ", "ầ", "ẩ", "ẫ", "ậ", "ă", "ắ", "ằ", "ẳ", "ẵ", "ặ",  
                "đ",  
                "é","è","ẻ","ẽ","ẹ","ê","ế","ề","ể","ễ","ệ",  
                "í","ì","ỉ","ĩ","ị",  
                "ó","ò","ỏ","õ","ọ","ô","ố","ồ","ổ","ỗ","ộ","ơ","ớ","ờ","ở","ỡ","ợ",  
                "ú","ù","ủ","ũ","ụ","ư","ứ","ừ","ử","ữ","ự",  
                "ý","ỳ","ỷ","ỹ","ỵ",};
            string[] arr2 = new string[] { "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a",  
                "d",  
                "e","e","e","e","e","e","e","e","e","e","e",  
                "i","i","i","i","i",  
                "o","o","o","o","o","o","o","o","o","o","o","o","o","o","o","o","o",  
                "u","u","u","u","u","u","u","u","u","u","u",  
                "y","y","y","y","y",};
            for (int i = 0; i < arr1.Length; i++)
            {
                text = text.Replace(arr1[i], arr2[i]);
                text = text.Replace(arr1[i].ToUpper(), arr2[i].ToUpper());
            }
            return text;
        }

        /// <summary>
        /// hàm chuyển tiếng việt sang không dấu
        /// </summary>
        /// <param name="_string"></param>
        /// <returns></returns>
        public string ConvertToUnSign(string _string)
        {
            if (String.IsNullOrEmpty(_string))
            {
                return "";
            }
            for (int i = 33; i < 48; i++)
            {
                _string = _string.Replace(((char)i).ToString(), "");
            }

            for (int i = 58; i < 65; i++)
            {
                _string = _string.Replace(((char)i).ToString(), "");
            }

            for (int i = 91; i < 97; i++)
            {
                _string = _string.Replace(((char)i).ToString(), "");
            }

            for (int i = 123; i < 127; i++)
            {
                _string = _string.Replace(((char)i).ToString(), "");
            }

            //text = text.Replace(" ", "-"); //Comment lại để không đưa khoảng trắng thành ký tự -

            Regex regex = new Regex(@"\p{IsCombiningDiacriticalMarks}+");

            string strFormD = _string.Normalize(NormalizationForm.FormD);

            return regex.Replace(strFormD, String.Empty).Replace('\u0111', 'd').Replace('\u0110', 'D');
        }

        /// <summary>
        /// Mã hóa pass 1 chiều
        /// </summary>
        /// <param name="password"></param>
        /// <returns></returns>
        public static string EncryptUsingMD5(string password)
        {
            try
            {
                if (password == null) throw new ArgumentNullException("password");

                byte[] encryptedBytes = PWD_CRYPTO.ComputeHash(Encoding.UTF8.GetBytes(password));

                StringBuilder sb = new StringBuilder();
                foreach (byte b in encryptedBytes) sb.AppendFormat("{0:x2}", b);

                return sb.ToString();
            }
            catch (Exception ex)
            {
                _logFile.Write("Exception when using Utils:EncryptUsingMD5 Message:" + ex.Message + " Source:" + ex.Source + " StackTrace:" + ex.StackTrace);
            }
            return "";
        }
        #endregion

        /// <summary>
        /// Mã hóa 1 chiều
        /// </summary>
        /// <param name="password"></param>
        /// <returns></returns>
        public static string HashPassword(string password)
        {
            try
            {
                if (password == null) throw new ArgumentNullException("password");

                byte[] encryptedBytes = PWD_CRYPTO.ComputeHash(Encoding.UTF8.GetBytes(password));

                StringBuilder sb = new StringBuilder();
                foreach (byte b in encryptedBytes) sb.AppendFormat("{0:x2}", b);

                return sb.ToString();
            }
            catch (Exception ex)
            {
                _logFile.Write("Exception when using HashPassword : " + ex.Message + " Source:" + ex.Source + " StackTrace:" + ex.StackTrace);
                return "";
            }
        }

        /// <summary>
        /// xuannt: Hàm tạo mã tự tăng
        /// </summary>
        /// <param name="frefix">Kí tự đầu tiên của mã</param>
        /// <param name="number">Số chữ số đằng sau</param>
        /// <param name="maCuoibanghi">Mã cuối cùng trong bản ghi cần thêm mã tự tăng</param>
        /// <returns></returns>
        public string MaTuTang(string frefix, int number, string maCuoibanghi)
        {
            string numberZero = "";
            string maCuoi = "";
            long numberMax = 0;
            string max = "";

            for (int i = 1; i <= number; i++)
            {
                max += "9";
            }
            numberMax = Convert.ToInt64(max);
            for (int i = 1; i < number; i++)
            {
                numberZero += "0";
            }
            if (maCuoibanghi == "")
            {
                maCuoi = numberZero + "1";
            }
            else
            {
                string strNumber = maCuoibanghi.Substring(frefix.Length, number);
                int ma = Convert.ToInt32(strNumber);
                ma = ma + 1;
                int sochuso = ma.ToString().Length;
                if (sochuso <= number && ma <= numberMax)
                {
                    int zeroInsert = number - sochuso;
                    for (int i = 1; i <= zeroInsert; i++)
                    {
                        maCuoi += "0";
                    }
                    maCuoi += ma.ToString();
                }
                else
                {
                    string result = MaTuTang(frefix, number + 1, frefix + numberZero + "00");
                    return result;
                }
            }
            return frefix + maCuoi;
        }

        /// <summary>
        /// Hàm tạo mã tự tăng
        /// </summary>
        /// <param name="frefix">Kí tự đầu tiên của mã</param>
        /// <param name="number">Số chữ số đằng sau</param>
        /// <param name="maCuoibanghi">Mã cuối cùng trong bản ghi cần thêm mã tự tăng</param>
        /// <returns></returns>
        public string MaTuTang(string frefix, int number, string maCuoibanghi, int demNguoiDungClick)
        {
            string numberZero = "";
            string maCuoi = "";
            long numberMax = 0;
            string max = "";

            for (int i = 1; i <= number; i++)
            {
                max += "9";
            }
            numberMax = Convert.ToInt64(max);
            for (int i = 1; i < number; i++)
            {
                numberZero += "0";
            }
            if (maCuoibanghi == "")
            {
                maCuoi = numberZero + "1";
            }
            else
            {
                string strNumber = maCuoibanghi.Substring(frefix.Length, number);
                int ma = Convert.ToInt32(strNumber);
                if (demNguoiDungClick != 0)
                {
                    ma = ma + demNguoiDungClick;
                }
                else
                {
                    ma = ma + 1;
                }
                int sochuso = ma.ToString().Length;
                if (sochuso <= number && ma <= numberMax)
                {
                    int zeroInsert = number - sochuso;
                    for (int i = 1; i <= zeroInsert; i++)
                    {
                        maCuoi += "0";
                    }
                    maCuoi += ma.ToString();
                }
                else
                {
                    string result = MaTuTang(frefix, number + 1, frefix + numberZero + "00");
                    return result;
                }
            }
            return frefix + maCuoi;
        }

        /// <summary>
        /// Lấy ra ngày đầu tiên trong tháng có chứa 
        /// 1 ngày bất kỳ được truyền vào
        /// </summary>
        /// <param name="dtDate">Ngày nhập vào</param>
        /// <returns>Ngày đầu tiên trong tháng</returns>
        public static DateTime GetFirstDayOfMonth(DateTime dtInput)
        {
            DateTime dtResult = dtInput;
            dtResult = dtResult.AddDays((-dtResult.Day) + 1);
            return dtResult;
        }

        /// <summary>
        /// Lấy ra ngày đầu tiên trong tháng được truyền vào 
        /// là 1 số nguyên từ 1 đến 12
        /// </summary>
        /// <param name="iMonth">Thứ tự của tháng trong năm</param>
        /// <returns>Ngày đầu tiên trong tháng</returns>
        public static DateTime GetFirstDayOfMonth(int iMonth)
        {
            DateTime dtResult = new DateTime(DateTime.Now.Year, iMonth, 1);
            dtResult = dtResult.AddDays((-dtResult.Day) + 1);
            return dtResult;
        }

        /// <summary>
        /// Lấy ra ngày cuối cùng trong tháng có chứa 
        /// 1 ngày bất kỳ được truyền vào
        /// </summary>
        /// <param name="dtInput">Ngày nhập vào</param>
        /// <returns>Ngày cuối cùng trong tháng</returns>
        public static DateTime GetLastDayOfMonth(DateTime dtInput)
        {
            DateTime dtResult = dtInput;
            dtResult = dtResult.AddMonths(1);
            dtResult = dtResult.AddDays(-(dtResult.Day));
            return dtResult;
        }

        /// <summary>
        /// Lấy ra ngày cuối cùng trong tháng được truyền vào
        /// là 1 số nguyên từ 1 đến 12
        /// </summary>
        /// <param name="iMonth"></param>
        /// <returns></returns>
        public static DateTime GetLastDayOfMonth(int iMonth)
        {
            DateTime dtResult = new DateTime(DateTime.Now.Year, iMonth, 1);
            dtResult = dtResult.AddMonths(1);
            dtResult = dtResult.AddDays(-(dtResult.Day));
            return dtResult;
        }

        /// <summary>
        /// Lấy ra ngày đầu tiên trong tuần của ngày nhập vào 
        /// với Culture mặc định là Culture hiện tại
        /// </summary>
        /// <param name="dayInWeek">Ngày nhập vào</param>
        /// <returns>Ngày đầu tiên trong tuần</returns>
        public static DateTime GetFirstDayOfWeek(DateTime dayInWeek)
        {
            CultureInfo defaultCultureInfo = CultureInfo.CurrentCulture;
            return GetFirstDayOfWeek(dayInWeek, defaultCultureInfo);
        }

        /// <summary>
        /// Lấy ra ngày đầu tiên trong tuần của ngày nhập vào
        /// với một Culture cụ thể được truyền vào
        /// </summary>
        /// <param name="dayInWeek">Ngày nhập vào</param>
        /// <param name="cultureInfo">CultureInfo quy định các thông tin về Culture 
        /// ( định dạng ngày tháng, ngày bắt đầu trong tuần , ... )
        /// </param>
        /// <returns></returns>
        public static DateTime GetFirstDayOfWeek(DateTime dayInWeek, CultureInfo cultureInfo)
        {
            DayOfWeek firstDay = cultureInfo.DateTimeFormat.FirstDayOfWeek;
            DateTime firstDayInWeek = dayInWeek.Date;
            while (firstDayInWeek.DayOfWeek != firstDay)
            {
                firstDayInWeek = firstDayInWeek.AddDays(-1);
            }
            return firstDayInWeek;
        }

        /// <summary>
        /// Lấy ra ngày đầu tiên trong tuần của ngày nhập vào
        /// với 1 giá trị cụ thể của enum DayOfWeek chỉ định 
        /// ngày bắt đầu tuần là thứ mấy
        /// </summary>
        /// <param name="dayInWeek">Ngày nhập vào</param>
        /// <param name="dayOfWeek">enum chỉ định thứ bắt đầu tuần</param>
        /// <returns></returns>
        public static DateTime GetFirstDayOfWeek(DateTime dayInWeek, DayOfWeek dayOfWeek)
        {
            DateTime firstDayInWeek = dayInWeek.Date;
            while (firstDayInWeek.DayOfWeek != dayOfWeek)
            {
                firstDayInWeek = firstDayInWeek.AddDays(-1);
            }
            return firstDayInWeek;
        }

        /// <summary>
        /// Xóa dữ liệu đăng nhập file text
        /// </summary>
        public void ClearTextConfig()
        {
            try
            {
                if (File.Exists(syscf_File))
                {
                    File.Delete(syscf_File);
                }
            }
            catch (Exception ex)
            {
                _logFile.Write("Exception when using HashPassword : " + ex.Message + " Source:" + ex.Source + " StackTrace:" + ex.StackTrace);

            }
        }

        /// <summary>
        /// Ghi thông tin đăng nhập vào file text syscf
        /// </summary>
        /// <param name="_IDNguoiDung"></param>
        /// <param name="_TenDangNhap"></param>
        /// <param name="_IDVaiTro"></param>
        /// <param name="_TenVaiTro"></param>
        public void WriteTextConfig(int _IDNguoiDung, string _TenDangNhap, string _MatKhau, int _IDVaiTro, string _TenVaiTro, string _SaveLogin)
        {
            string IDND = EncryptCode(_IDNguoiDung.ToString(), sKeyEncripts, false);
            string TenDangNhap = EncryptCode(_TenDangNhap, sKeyEncripts, false);
            string IDVT = EncryptCode(_IDVaiTro.ToString(), sKeyEncripts, false);
            string TenVaiTro = EncryptCode(_TenVaiTro, sKeyEncripts, false);
            string MatKhau = EncryptCode(_MatKhau, sKeyEncripts, false);
            string SaveLog = EncryptCode(_SaveLogin, sKeyEncripts, false);
            string MacAddress = EncryptCode(GetClientMACAddress(), sKeyEncripts, false);
            try
            {
                StreamWriter f = new StreamWriter(syscf_File, true);
                f.WriteLine(SaveLogin + ":" + SaveLog);
                f.WriteLine(MacPC + ":" + MacAddress);
                f.WriteLine(UserID + ":" + IDND);
                f.WriteLine(UserName + ":" + TenDangNhap);
                f.WriteLine(PassWord + ":" + MatKhau);
                f.WriteLine(RoleID + ":" + IDVT);
                f.WriteLine(RoleName + ":" + TenVaiTro);
                f.Close();
            }
            catch (Exception ex)
            {
                _logFile.Write("Exception when using WriteTextConfig : " + ex.Message + " Source:" + ex.Source + " StackTrace:" + ex.StackTrace);
            }
        }

        /// <summary>
        /// Đọc ID người đăng nhập
        /// </summary>
        /// <returns></returns>
        public int GetUserID()
        {
            int iRes = 0;
            try
            {
                StreamReader reader = new StreamReader(syscf_File, Encoding.UTF8);
                string readAll = reader.ReadToEnd();
                reader.Close();
                string[] lines = readAll.Split('\n');

                foreach (string line in lines)
                {
                    if (line.Contains(UserID))
                    {
                        iRes = Int32.Parse(DecryptCode(line.Split(':')[1], sKeyEncripts, false));
                    }
                }
            }
            catch (Exception ex)
            {
                _logFile.Write("Exception when using GetUserID : " + ex.Message + " Source:" + ex.Source + " StackTrace:" + ex.StackTrace);
            }
            return iRes;
        }

        /// <summary>
        /// Đọc ID người đăng nhập
        /// </summary>
        /// <returns></returns>
        public string GetSaveLog()
        {
            string iRes = "";
            try
            {
                StreamReader reader = new StreamReader(syscf_File, Encoding.UTF8);
                string readAll = reader.ReadToEnd();
                reader.Close();
                string[] lines = readAll.Split('\n');

                foreach (string line in lines)
                {
                    if (line.Contains(SaveLogin))
                    {
                        iRes = DecryptCode(line.Split(':')[1], sKeyEncripts, false).ToString();
                    }
                }
            }
            catch (Exception ex)
            {
                _logFile.Write("Exception when using GetUserID : " + ex.Message + " Source:" + ex.Source + " StackTrace:" + ex.StackTrace);
            }
            return iRes;
        }

        /// <summary>
        /// Đọc ID người đăng nhập
        /// </summary>
        /// <returns></returns>
        public string GetMacAddSave()
        {
            string iRes = "";
            try
            {
                StreamReader reader = new StreamReader(syscf_File, Encoding.UTF8);
                string readAll = reader.ReadToEnd();
                reader.Close();
                string[] lines = readAll.Split('\n');

                foreach (string line in lines)
                {
                    if (line.Contains(MacPC))
                    {
                        iRes = DecryptCode(line.Split(':')[1], sKeyEncripts, false).ToString();
                    }
                }
            }
            catch (Exception ex)
            {
                _logFile.Write("Exception when using GetUserID : " + ex.Message + " Source:" + ex.Source + " StackTrace:" + ex.StackTrace);
            }
            return iRes;
        }

        /// <summary>
        /// Đọc tên đăng nhập người sử dụng
        /// </summary>
        /// <returns></returns>
        public string GetUserName()
        {
            string sRes = "";
            try
            {
                StreamReader reader = new StreamReader(syscf_File, Encoding.UTF8);
                string readAll = reader.ReadToEnd();
                reader.Close();
                string[] lines = readAll.Split('\n');

                foreach (string line in lines)
                {
                    if (line.Contains(UserName))
                    {
                        sRes = DecryptCode(line.Split(':')[1], sKeyEncripts, false);
                    }
                }
            }
            catch (Exception ex)
            {
                _logFile.Write("Exception when using GetUserID : " + ex.Message + " Source:" + ex.Source + " StackTrace:" + ex.StackTrace);
            }
            return sRes;
        }

        /// <summary>
        /// Đọc mật khẩu người sử dụng
        /// </summary>
        /// <returns></returns>
        public string GetPassWord()
        {
            string sRes = "";
            try
            {
                StreamReader reader = new StreamReader(syscf_File, Encoding.UTF8);
                string readAll = reader.ReadToEnd();
                reader.Close();
                string[] lines = readAll.Split('\n');

                foreach (string line in lines)
                {
                    if (line.Contains(PassWord))
                    {
                        sRes = DecryptCode(line.Split(':')[1], sKeyEncripts, false);
                    }
                }
            }
            catch (Exception ex)
            {
                _logFile.Write("Exception when using GetUserID : " + ex.Message + " Source:" + ex.Source + " StackTrace:" + ex.StackTrace);
            }
            return sRes;
        }

        /// <summary>
        /// Đọc ID vai trò người dùng đăng nhập
        /// </summary>
        /// <returns></returns>
        public int GetRoleID()
        {
            int iRes = 0;
            try
            {
                StreamReader reader = new StreamReader(syscf_File, Encoding.UTF8);
                string readAll = reader.ReadToEnd();
                reader.Close();
                string[] lines = readAll.Split('\n');

                foreach (string line in lines)
                {
                    if (line.Contains(RoleID))
                    {
                        iRes = Int32.Parse(DecryptCode(line.Split(':')[1], sKeyEncripts, false));
                    }
                }
            }
            catch (Exception ex)
            {
                _logFile.Write("Exception when using GetUserID : " + ex.Message + " Source:" + ex.Source + " StackTrace:" + ex.StackTrace);
            }
            return iRes;
        }

        /// <summary>
        /// Đọc tên vai trò người dùng đăng nhập
        /// </summary>
        /// <returns></returns>
        public string GetRoleName()
        {
            string sRes = "";
            try
            {
                StreamReader reader = new StreamReader(syscf_File, Encoding.UTF8);
                string readAll = reader.ReadToEnd();
                reader.Close();
                string[] lines = readAll.Split('\n');

                foreach (string line in lines)
                {
                    if (line.Contains(RoleName))
                    {
                        sRes = DecryptCode(line.Split(':')[1], sKeyEncripts, false);
                    }
                }
            }
            catch (Exception ex)
            {
                _logFile.Write("Exception when using GetUserID : " + ex.Message + " Source:" + ex.Source + " StackTrace:" + ex.StackTrace);
            }
            return sRes;
        }

        public static string ConvertToMoney(double _dMoney)
        {
            string Data = "";
            if (_dMoney != null)
            {
                Data = _dMoney.ToString("0,0");
            }
            return Data;
        }

        public static string ConvertToMoneyVN(double _dMoney)
        {
            string Data = "";
            try
            {
                if (_dMoney == 0)
                {
                    Data = "0";
                }
                else
                {
                    Data = _dMoney.ToString("0,0", CultureInfo.CreateSpecificCulture("vi-VN"));
                    if (Data.Contains("."))
                        Data = Data.Replace(".", ",");
                }
            }
            catch (Exception ex)
            {
                ;
            }

            return Data;
        }

        /// <summary>
        /// Hàm chuyển sang tiền VN với dấu phân cách tự chọn ("." hoặc ",")
        /// </summary>
        /// <param name="_dMoney">Số tiền truyền vào dạng double</param>
        /// <param name="dot">Kiểu phân cách</param>
        /// <returns>Trả về tiền được chuyển hóa sang kiểu string</returns>
        public static string ConvertToMoneyVN_dot(double _dMoney, string dot)
        {
            string Data = "";
            try
            {
                if (_dMoney == 0)
                {
                    Data = "0";
                }
                else
                {
                    Data = _dMoney.ToString("0,0", CultureInfo.CreateSpecificCulture("vi-VN"));
                    if (dot == "," && Data.Contains("."))
                        Data = Data.Replace(".", ",");
                    if (dot == "." && Data.Contains(","))
                        Data = Data.Replace(",", ".");
                }
            }
            catch (Exception ex)
            {
                ;
            }

            return Data;
        }

        /// <summary>
        /// Doc day so dang Tien Viet Nam
        /// </summary>
        /// <param name="number">1234567890</param>
        /// <returns>Một tỷ hai trăm ba mươi tư triệu năm trăm sáu mươi bảy nghìn tám trăm chín mươi đồng.</returns>
        public static string ChuyenSo(string number)
        {
            string[] strTachPhanSauDauPhay;
            if (number.Contains('.') || number.Contains(','))
            {
                strTachPhanSauDauPhay = number.Split(',', '.');
                return (ChuyenSo(strTachPhanSauDauPhay[0]) + "phẩy " + ChuyenSo(strTachPhanSauDauPhay[1]));
            }

            string[] dv = { "", "mươi", "trăm", "nghìn", "triệu", "tỉ" };
            string[] cs = { "không", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín" };
            string doc;
            int i, j, k, n, len, found, ddv, rd;

            len = number.Length;
            number += "ss";
            doc = "";
            found = 0;
            ddv = 0;
            rd = 0;

            i = 0;
            while (i < len)
            {
                //So chu so o hang dang duyet
                n = (len - i + 2) % 3 + 1;

                //Kiem tra so 0
                found = 0;
                for (j = 0; j < n; j++)
                {
                    if (number[i + j] != '0')
                    {
                        found = 1;
                        break;
                    }
                }

                //Duyet n chu so
                if (found == 1)
                {
                    rd = 1;
                    for (j = 0; j < n; j++)
                    {
                        ddv = 1;
                        switch (number[i + j])
                        {
                            case '0':
                                if (n - j == 3) doc += cs[0] + " ";
                                if (n - j == 2)
                                {
                                    if (number[i + j + 1] != '0') doc += "linh ";
                                    ddv = 0;
                                }
                                break;
                            case '1':
                                if (n - j == 3) doc += cs[1] + " ";
                                if (n - j == 2)
                                {
                                    doc += "mười ";
                                    ddv = 0;
                                }
                                if (n - j == 1)
                                {
                                    if (i + j == 0) k = 0;
                                    else k = i + j - 1;

                                    if (number[k] != '1' && number[k] != '0')
                                        doc += "mốt ";
                                    else
                                        doc += cs[1] + " ";
                                }
                                break;
                            case '5':
                                if ((i + j == len - 1) || (i + j + 3 == len - 1))
                                    doc += "lăm ";
                                else
                                    doc += cs[5] + " ";
                                break;
                            default:
                                doc += cs[(int)number[i + j] - 48] + " ";
                                break;
                        }

                        //Doc don vi nho
                        if (ddv == 1)
                        {
                            doc += ((n - j) != 1) ? dv[n - j - 1] + " " : dv[n - j - 1];
                        }
                    }
                }

                //Doc don vi lon
                if (len - i - n > 0)
                {
                    if ((len - i - n) % 9 == 0)
                    {
                        if (rd == 1)
                            for (k = 0; k < (len - i - n) / 9; k++)
                                doc += "tỉ ";
                        rd = 0;
                    }
                    else
                        if (found != 0) doc += dv[((len - i - n + 1) % 9) / 3 + 2] + " ";
                }

                i += n;
            }

            if (len == 1)
                if (number[0] == '0' || number[0] == '5') return cs[(int)number[0] - 48];
            string Letter = doc.Substring(0, 1).ToUpper();
            return Letter + doc.Substring(1, (doc.Length - 1)) + "đồng.";
        }

        /// <summary>
        /// Lay dia chi MAC cua Client
        /// </summary>
        /// <returns>Dia chi MAC</returns>
        public static string GetClientMACAddress()
        {
            string macAddresses = String.Empty;

            foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
            {
                if (nic.OperationalStatus == OperationalStatus.Up)
                {
                    macAddresses += nic.GetPhysicalAddress().ToString();
                    break;
                }
            }

            return macAddresses;
        }

        /// <summary>
        /// Kiểm tra định dạng số điện thoại
        /// </summary>
        /// <param name="number">Số điện thoại kiểu xâu</param>
        /// <returns>True/False</returns>
        public static bool CheckPhoneNumber(string number)
        {
            //Kiểm tra số lượng số
            if (number.Length < 10 || number.Length > 11)
                return false;

            //Cắt lấy đầu số
            var numbercut = number.Substring(0, number.Length - 7);

            //Kiểm tra đầu số vừa cắt có nằm trong mảng đầu số không
            if (!ssDausodienthoai.Contains(numbercut))
                return false;
            return true;
        }

        /// <summary>
        /// Hàm kiểm tra định dạng Email
        /// </summary>
        /// <param name="Email">Chuỗi Email truyền vào</param>
            /// <returns>True/False</returns>
        public static bool CheckValidEmail(string Email)
        {
            string Rules = @"^[\w\.]+@[\w]+\.[\w]+";
            Regex MyRegex = new Regex(Rules);
            return MyRegex.IsMatch(Email);
        }

        /// <summary>
        /// Hàm kiểm tra định dạng nick Yahoo (@yahoo.com hoặc @yahoo.com.vn)
        /// </summary>
        /// <param name="Email">Chuỗi Nick Yahoo truyền vào</param>
        /// <returns>True/False</returns>
        public static bool CheckNickYahoo(string NickYahoo)
        {
            string Rules1 = @"^[\w\.]+@[|y]+[|a]+[|h]+[|o]+[|o]+\.+[|c]+[|o]+[|m]$";
            string Rules2 = @"^[\w\.]+@[|y]+[|a]+[|h]+[|o]+[|o]+\.+[|c]+[|o]+[|m]+\.+[|v][|n]$";
            Regex MyRegex1 = new Regex(Rules1);
            Regex MyRegex2 = new Regex(Rules2);
            return MyRegex1.IsMatch(NickYahoo) || MyRegex2.IsMatch(NickYahoo);
        }

    }
}
